#include <stdlib.h>
#include <string.h>

/*
 * atoi - Convierte @str a un entero (*)
 * 
 */

int atoi(const char* s)
{
	int i, n, sign;
	
	for(i = 0; isspace(s[i]); i++)	/* skip white space */
		;
	
	sign = (s[i] == '-' ? -1 : 1);
	if(s[i] == '+' || s[i] == '-')	/* skip sign */
		i++;
		
	for(n = 0; isdigit(s[i]); i++)
		n = 10 * n + (s[i] - '0');
		
	return sign * n;
}

/*
 * itoa - Convierte entero en un string en una cierta base (**)
 * 
 */
 
char digits[] = "0123456789ABCDEF";
 
char* itoa(int n, char *str, unsigned int base)
{
	int  i, sign;
	
	if((sign = n) < 0 && base == 10)	/* record sign */
		n = -n;							/* make n positive */
		
	i = 0;
	do 					/* generate digits in reverse order */
	{			
		str[i++] = digits[n % base];		/* get next digit */
	} while((n /= base) > 0);
	
	if(sign < 0 && base == 10)
		str[i++] = '-';
			
	str[i] = '\0';
	reverse(str);
	
	return str;
}


/*
 * reverse - Invierte el contenido de un string (*)
 * 
 */
 
void reverse(char* str)
{
	int c, i, j;
	
	for(i = 0, j = strlen(str)-1; i < j; i++, j--)
	{
		c = str[i];
		str[i] = str[j];
		str[j] = c;
	}
}

/* Estas funciones pertenecen a ctype.h */

int isspace(char c)
{
	return ((c == ' ') || (c == '\n') || (c == '\t') || (c == '\v') || (c == '\f') || (c == '\r'));
}

int isdigit(char c)
{
	return (('0' <= c) && (c <= '9'));
}

// (*)  Codigo tomado de "The C Programming Lenguage"
// (**) Codigo tomado de "The C Programming Lenguage" con algunas modificaciones propias

